// import { getOpenId } from '@/utils/wx/wxopenid'
import * as types from '../mutation-types'
import {
  USER_CHECK_LOGIN,
  USER_GET_VERIFICATION_CODE,
  USER_MOBILE_LOGIN,
  USER_BIND_REGIST_CODE,
  USER_SET_WX_USERINFO,
  ROAST_TALKING_BIND_ACTIVE_CODE,
  ROAST_TALKING_CHENK_ACTIVE_USER
} from '../../api/api'
import { postOnWxCode, postWithOpenUserId } from '../../methods/net'
import { post } from '@/methods/net'
import router from '../../router'
import { loading } from '@/methods/talk'
import { environment, decodeBase64 } from '@/methods/tool'

const actions = {
    // 获取openId
  getOpenId ({ state, commit, dispatch }, obj) {
        // 如果有openid并且有unionid 就去不需要获取
    if (state.wxUser && state.wxUser.openid && state.wxUser.unionid) {
      return false
    }
        // 如果路由上有openid并且有unionid 就去不需要获取
    if (obj.openid && obj.unionid) {
      if (obj.nickname) {
        obj.signNickname = obj.nickname
        obj.nickname = decodeBase64(obj.nickname)
      }
      commit(types.LOGIN_EDIT_COMMON, { key: 'wxUser', data: obj })
            // 要调用接口存起来哦
      dispatch('recordUserWxUserInfo')
      return false
    }
        // 不再微信环境中不获取openid
    if (!environment.isWeixin()) {
      return false
    }
    // getOpenId('noAuto', true)
  },
    // 存储用户微信信息
  async recordUserWxUserInfo ({ state }) {
    try {
      const { sex, picurl, nickname, signNickname = '', openid, unionid, subscribe, nonce, timestamp, signature } = state.wxUser
      let params = {
        gender: sex,
        headImg: picurl,
        nickname,
        openId: openid,
        unionid,
        subscribe,
        nonce,
        timestamp,
        signature,
        signNickname
      }
      await post(USER_SET_WX_USERINFO, params)
    } catch (error) {
      console.log(error)
    }
  },
    // 判断业务员登录状态
    /**
    * type 成功跳转类型 route:路由跳转/location:浏览器跳转
    * path 跳转路径
    */
  async checkClerkStatus ({ state, dispatch }, backUrl) {
    console.log('环境', state.channel)
    if (state.channel === 'app') {
      return dispatch('appCheckClerkStatus', backUrl)
    } else {
      return dispatch('wxCheckClerkStatus', backUrl)
    }
  },
    // 从微信跳转过来的走正常流程
  async wxCheckClerkStatus ({ commit }, backUrl) {
    try {
      const res = await postOnWxCode(USER_CHECK_LOGIN)
      if (!res) return false
            // 如果没有登录
      if (res.loggedOn === 'N') {
        setBackUrl(backUrl)
        router.replace({ name: 'login-phone' })
      } else {
                // 如果已经登录了
        commit(types.LOGIN_EDIT_COMMON, { key: 'user', data: res })
                // 如果既登录又绑码了就视为成功
        if (res.isBindRegistCode === 'Y' && (res.userType === 'ZT' || res.userType === 'VZT')) {
          return true
        } else {
                    // 如果没绑码，去绑码
          setBackUrl(backUrl)
          router.replace({ name: 'binging-code' })
        }
      }
    } catch (error) {
      console.log(error)
    }
  },
    // 从app跳转过来的，要调用另一个接口，并且不去登录只是绑码
  async appCheckClerkStatus ({ commit }, backUrl) {
    try {
      const res = await postWithOpenUserId(ROAST_TALKING_CHENK_ACTIVE_USER)
      if (!res) return false
      commit(types.LOGIN_EDIT_COMMON, { key: 'user', data: res })
            // 如果既登录又绑码了就视为成功
      if (res.isBindRegistCode === 'Y' && res.userType === 'ZT') {
        return true
      } else {
        const result = await postOnWxCode(USER_CHECK_LOGIN)
        if (!result) return false
        if (result.isBindRegistCode === 'Y' && (result.userType === 'ZT' || result.userType === 'VZT')) {
          return true
        } else {
                    // 如果没绑码，去绑码
          setBackUrl(backUrl)
          router.replace({ name: 'binging-code-only' })
        }
      }
    } catch (error) {
      console.log(error)
    }
  },
    // app 检查用户类型 true为A端
  async checkAppUserType ({ commit }) {
    const res = await postWithOpenUserId(ROAST_TALKING_CHENK_ACTIVE_USER)
    commit(types.LOGIN_EDIT_COMMON, { key: 'user', data: res })
        // 如果用户登录了并且绑定了综拓码视为A端否则为C端
    return res && { userType: res.userType }
  },
    // 检查用户类型 true为A端
  async checkUserType ({ commit }) {
    try {
      const res = await postOnWxCode(USER_CHECK_LOGIN)
      commit(types.LOGIN_EDIT_COMMON, { key: 'user', data: res })
            // 如果用户登录了并且绑定了综拓码视为A端否则为C端
      return res && { loggedOn: res.loggedOn, userType: res.userType }
    } catch (error) {
      console.log(error)
    }
  },
    // 发送验证码
  async sendCode ({ state, dispatch }) {
    try {
      console.log(state)
      const res = await postOnWxCode(USER_GET_VERIFICATION_CODE, { mobile: state.enter.phone })
      if (!res) return false
      dispatch('countDown')
      return true
    } catch (error) {
      console.log(error)
    }
  },
    // 倒计时
  countDown ({ state, commit }) {
    commit(types.LOGIN_EDIT_COMMON, { objName: 'enter', key: 'time', data: 120 })
    let timeId = setInterval(() => {
      if (state.enter.time >= 0) {
        commit(types.LOGIN_EDIT_COMMON, { objName: 'enter', key: 'time', data: state.enter.time - 1 })
      } else {
        clearInterval(state.enter.timeId)
      }
    }, 1000)
    commit(types.LOGIN_EDIT_COMMON, { objName: 'enter', key: 'timeId', data: timeId })
  },
    // 使用手机号码登录
    /** getBackUrl 跳转至发起登录的页面 */
  async loginByPhone ({ state, commit }) {
    try {
      loading(true)
      const res = await postOnWxCode(USER_MOBILE_LOGIN, {
        mobile: state.enter.phone,
        verifyCode: state.enter.verificationCode
      })
      if (!res) {
        commit(types.LOGIN_EDIT_COMMON, {
          objName: 'enter',
          key: 'verificationCode',
          data: ''
        })
        return false
      }
      commit(types.LOGIN_EDIT_MULTIPLE_COMMON, {
        list: [
          {
            key: 'user',
            data: res.userInfo
          },
          {
            key: 'token',
            data: res.token
          }
        ]
      })
      if (
        res.userInfo.isBindRegistCode === 'Y' &&
                (res.userInfo.userType === 'ZT' || res.userInfo.userType === 'VZT')
      ) {
                // 跳转到发起登录请求的页面
        setBackUrl()
      } else {
        router.replace({ name: 'binging-code' })
      }
      return res
    } finally {
      loading(false)
    }
  },
    // 绑定注册码
  async bindingCode ({ state }) {
    try {
      let params = {
        registCode: state.enter.code || '',
        registType: '1',
        userName: state.enter.name || '',
        idNo: state.enter.cardNum || '',
        umCode: ''
      }
            // 需要判断是否已同意协议
            // 绑定注册码
      const res = await postOnWxCode(USER_BIND_REGIST_CODE, params)
      if (res) {
                // 跳转到发起登录请求的页面
        setBackUrl()
      }
    } catch (error) {
      console.log(error)
    }
  },
    // 仅为活动开通的绑码接口
  async bindingCodeOnly () {
    try {
      let params = {
        registCode: state.enter.code || '',
        registType: '1'
      }
            // 需要判断是否已同意协议
            // 绑定注册码
      const res = await postWithOpenUserId(ROAST_TALKING_BIND_ACTIVE_CODE, params)
      if (res) {
                // 跳转到发起登录请求的页面
        setBackUrl()
      }
    } catch (error) {
      console.log(error)
    }
  }
}

const mutations = {
    // 添加数据的方法
  [types.LOGIN_EDIT_COMMON] (state, { key, data, objName, index }) {
    if (index || index === 0) {
      state[objName][index][key] = data
    } else if (objName) {
      state[objName][key] = data
    } else {
      state[key] = data
    }
  },
    // 批量添加数据的方法
  [types.LOGIN_EDIT_MULTIPLE_COMMON] (state, { objName, index, list }) {
    let keyName = ''
    if (index || index === 0) {
      keyName = [objName][index]
    } else if (objName) {
      keyName = [objName]
    }
    list.forEach((item) => {
      if (keyName) {
        state[keyName][item.key] = item.data
      } else {
        state[item.key] = item.data
      }
    })
  }
}

const initState = {
  wxUser: {
    openid: '',
    picurl: '', // 图片地址
    subscribe: '', // 订阅信息 0表示未关注
    unionid: '',
    nickname: '', // 昵称
    sex: '' // 性别 1男 2女
  }, // 微信信息
  user: {
    userType: '',
    loggedOn: ''
  }, // 用户登录获取的信息
  token: '', // 用户token
  channel: '', // 渠道： app 或者 空为微信
    // 营销基地相关数据
  enter: {
    phone: '', // 输入的手机号
    verificationCode: '', // 输入的验证码
    time: -1,
    timeId: '',
    code: '', // 业务员码
    name: '', // 姓名
    cardNum: '' // 身份证号码
  },
  giftPlan: '', // 获取路由上的礼物发放计划并存起来
    // 跳转地址
  href: {
        // 直播
    live:
            'https://www.zhi-niao.com/app/liveShare/index.html?appid=com.pingan.zhiniao&source=liveShow&h5ShareType=1&liveRoomId=4328106&from=groupmessage&channel=QRCODE&liveKind=0',
        // 礼物
    gift: ''
  }
}

const state = sessionStorage.getItem('$_login') ? JSON.parse(sessionStorage.getItem('$_login')) : initState

/** 存储 / 跳转至发起登录操作的页面
 * type 成功跳转类型 route:路由跳转/location:浏览器跳转
 * path 跳转路径
 */
const setBackUrl = (backUrl) => {
    // 如果是存储模式
  if (backUrl) {
    sessionStorage.setItem('$_checkLoginSuccessUrl', JSON.stringify(backUrl))
    return false
  }
    // 如果是跳转模式
  const { type, path } = JSON.parse(sessionStorage.getItem('$_checkLoginSuccessUrl'))
  if (type === 'router') {
    router.replace({ path })
  }
}

export default {
  actions,
  state,
  mutations
}
